package com.esunny.springboot.service.impl;

import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.recipes.locks.InterProcessMutex;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.concurrent.TimeUnit;

@Service
public class TestServiceImpl {
    @Autowired
    private CuratorFramework zkClient;//在ZookeeperConfig文件中

    /**
     * zookeeper保证幂等性的原理就是多个线程去创建节点，获得锁的线程执行后不释放这个锁，那么其它线程超时而作废，从而保证幂等性
     */
    public int insertUser(String userName) throws Exception {
        System.out.println(Thread.currentThread() + "我在抢锁");
        InterProcessMutex lock = new InterProcessMutex(zkClient, "/" + userName);
        //获取锁，超时时间为5秒。
        boolean isLock = lock.acquire(5, TimeUnit.SECONDS);
        if (isLock) {
            System.out.println(Thread.currentThread() + "注册用户成功");
            //lock.release();//释放锁就保证不了幂等性了，因为你一释放，其它阻塞的线程就能获得锁继续执行。
            // 但是不释放，抢得锁的线程一直占有锁，会一直存在zookeeper中，导致zookeeper越来越臃肿，除非重启 锁才会释放（这里的锁是临时节点）。
            lock.release();
        } else {
            System.out.println(Thread.currentThread() + "我没抢到锁");
        }
        return 0;
    }
}
